package com.hmk.blogboot.web.admin;


import com.hmk.blogboot.po.Type;
import com.hmk.blogboot.service.TypeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableDefault;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import javax.validation.Valid;

@Controller
@RequestMapping("/admin")
public class TypeController {

    //自动注入博客类型的service接口
    @Autowired
    private TypeService typeService;
    //分页接口
    @GetMapping("/types")
    //进行分页，设置pageable参数，使用注解@pageableDefault
    //设置每页记录数，id排序 排序方式倒叙
    public String types(@PageableDefault(size= 3,sort = {"id"},direction = Sort.Direction.DESC)Pageable pageable,
                        Model model){
        //分页查询到记录，给model,在前端展示
        model.addAttribute("page",typeService.listType(pageable));
        //返回types 分类管理页面
        return "admin/types";
    }

    /*th:href="@{/admin/types/input}"
    * 新增分类接口资源路径
    * */
    @GetMapping("/types/input")
    public String input(Model model){
        model.addAttribute("type",new Type());
        //点击新增按钮跳转到types-input 在该页面进行输入分类名称添加到数据库中
        return "admin/types-input";
    }
    /*输入分类名称，点击提交按钮 post请求提交表单，
    *跳到/types post请求 的接口，数据保存到数据库
    *
    * */
    @PostMapping("/types")
    public String post(@Valid Type type,
                      BindingResult result,
                       RedirectAttributes attributes){

        //typeService接口调用getTypeByName 根据分类名称获取到分类记录
        Type type1 = typeService.getTypeByName(type.getName());
        //如果查询到，数据库已经存在该分类名称，不能添加重复记录
        if(type1!=null){
            result.rejectValue("name","nameError","不能添加重复字段");
        }
        //校验失败，name分类名称为空
        if(result.hasErrors()){
            //直接跳转到添加分类的名称页面
            return "admin/types-input";
        }


        //前端添加传来的分类数据保存到数据库
        Type t = typeService.saveType(type);
        //type保存到数据库是否成功
        if(t == null){
            //如果新增type失败 重定向附加一个提示信息参数
            attributes.addFlashAttribute("message","新增失败");
        }else{
            /*
            * redirectAttributes.addFlashAttributie("prama",value); 这
            * 种方法是隐藏了参数，链接地址上不直接暴露，但是能且只能在重定向的 “页面” 获取prama参数值。
            * 其原理就是放到session中，session在跳到页面后马上移除对象。
            * 如果是重定向一个controller中是获取不到该prama属性值的。
            * 除非在controller中用(@RequestPrama(value = "prama")String prama)注解，采用传参的方式。页面获值例如：
            * */
            //如果新增type成功，使用redirectAttributes对象，重定向跳转页面时，附加一个message参数
            attributes.addFlashAttribute("message","新增成功");
            //接下来types.html页面segmentUI 中ui组件message,提示新增成功或失败

        }
        //保存到数据库后跳转到types页面中
        return "redirect:/admin/types";
    }

    /*根据id进行获取博客分类，把博客分类通过模板发送给types页面*/
    @GetMapping("/types/{id}/input")
    public String editInput(@PathVariable Long id,Model model){
        /*在types页面点击编辑按钮，调用这个接口，把根据id查询数据添加到模板中*/
        /*传递给types-input页面填充*/

        //使用注入的typeService接口调用getType(id) 根据id进行查询获取type表的type记录，添加model
        model.addAttribute("type",typeService.getType(id));
        //做完跳转types-input页面
        return "admin/types-input";
    }

    /*重新写个方法修改type的记录*/
    @PostMapping("/types/{id}")
    public  String editPost(@Valid Type type,BindingResult result,@PathVariable Long id,RedirectAttributes attributes){
        //先进行根据分类名称查询该分类是否存在
        Type type1  = typeService.getTypeByName(type.getName());
        if(type1 != null){
            result.rejectValue("name","nameError","不能重复添加分类");
        }
        if(result.hasErrors()){
            return "admin/types-input";
        }
        Type t = typeService.updateType(id,type);
        if(t==null){
            attributes.addFlashAttribute("message","更新失败");
        }else{
            attributes.addFlashAttribute("message","更新成功");
        }
        return "redirect:/admin/types";
    }
    /*根据id进行删除*/
        @GetMapping("/types/{id}/delete")
        public String delete(@PathVariable Long id,RedirectAttributes  attributes){
            //typeService业务接口调用deleteType(id)根据id进行删除
            typeService.deleteType(id);
            //校验
            attributes.addFlashAttribute("message","删除成功");
            //跳转到types页面
            return "redirect:/admin/types";
        }

}
/*fen*/